package main

import (
	"runtime"
	"fmt"
	"sync"
)

func main()  {
	runtime.GOMAXPROCS(1) //使用多CPU多核 返回的是4线程
	wg:=sync.WaitGroup{} //作用：阻塞主线程，并等待所有子线程都执行完
	wg.Add(20) //等待线程数20

	for i:=0;i<10;i++{ //循环执行10次goroutine
	//fmt.Printf("i%p\n",&i)
	//当i不满足条件的时候才会执行10次goroutine,所以i的值输出10次10
		go func() {
			fmt.Printf("[%d]",i) //永久输出的都是10
			wg.Done() //WaitGroup数量-1
		}()
	}
	for i:=0;i<10;i++{//循环执行10次goroutine
		go func(i int) {
			//fmt.Printf("%p\n",&i) //地址每个都不一样了。
			fmt.Printf("-%d-",i)
			wg.Done()
		}(i)
	}
	wg.Wait() //执行阻塞，直到WaitGroup变为0
}


/*
答：因为第一个for的i是for的外部变量，地址是不变的，即使循环10次地址都是一样的，
0xc42001a0f0
0xc42001a0f0
0xc42001a0f0
0xc42001a0f0
0xc42001a0f0
0xc42001a0f0
0xc42001a0f0
0xc42001a0f0
0xc42001a0f0
0xc42001a0f0
遍历完成后，最终i的值是10，然后才执行go func，所以执行10次的结果都是10
第2个for循环我改了一下。每次遍历都将i的值传到go func的参数中，等for循环完后，再来执行go func，因为10次go func的地址
都不相同，所以值也不一样，所以输出的结果是0-9
*/
